"""
隐式等待
    ~ browser.implicitly_wait(5)
在多个窗口（页签）间切换
"""
import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions

options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)
browser = webdriver.Chrome(options=options)
# CDP - Chrome Developer Protocol
browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
    'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})
browser.get('https://www.jd.com/')
kw_input = browser.find_element_by_css_selector('#key')
kw_input.send_keys('手机')
kw_input.send_keys(Keys.RETURN)
# 添加一个隐式等待操作，如果获取的元素不存在，则等待5秒钟，
# 如果5秒钟之后还不存在，就产生TimeoutException异常
# 如果不做等待直接获取元素，拿不到元素的时候会产生NoSuchElementException
browser.implicitly_wait(5)
cart_button = browser.find_element_by_xpath('/html/body/div[3]/div[3]/div[1]/a')
cart_button.click()

time.sleep(3)
# 如果浏览器打开了多个窗口（页签），可以使用下面的方式切换窗口
browser.switch_to.window(browser.window_handles[0])

time.sleep(3)
browser.switch_to.window(browser.window_handles[1])

# 显示等待：创建一个等待对象
wait = WebDriverWait(browser, 10)
# 通过until方法设定等待的元素以及等待的条件，如果在指定的时间没有获得元素
# 将产生TimeoutException异常
add_button = wait.until(
    expected_conditions.presence_of_element_located(
        (By.XPATH, f'/html/body/div[4]/div[2]/div/div[2]/div[1]/div[2]/div[1]/ul/li[1]/div/div[4]/a')
    )
)
add_button.click()
browser.refresh()
